#include "flash.h"

void flash_begin(void){
	FLASH_Unlock();
}
uint flash_copy(void* dst,const void* src,uint size){
	if((uint)dst&1)						// not short aligned
		return 0;						// error
	uint ret=size;
	if(((uint)dst&2)&& size>1){			// not int aligned data
		FLASH_ProgramHalfWord((uint)dst,*(ushort*)src);
		dst=(void*)((uint)dst+2);
		src=(void*)((uint)src+2);
		size-=2;
	}
	for(;size>3;size-=4){
		FLASH_ProgramWord((uint)dst,*(uint*)src);
		dst=(void*)((uint)dst+4);
		src=(void*)((uint)src+4);
	}
	if(size>1){							// not int aligned data
		FLASH_ProgramHalfWord((uint)dst,*(ushort*)src);
		size-=2;
	}
	return ret-size;
}
void flash_end(void){
	FLASH_Lock();
}
void flash_erasePage(void* dst){
	FLASH_ErasePage((uint)dst);
}

void flash_put32(void* dst,uint value){
	FLASH_ProgramWord((uint)dst,value);
}

/*
uint flashCpy(void* dst,const void* src,uint size){
	if((uint)dst&1)						// not short aligned
		return 0;						// error
	uint ret=size;
	if(((uint)dst&2)&& size>1){			// not int aligned data
		FLASH_ProgramHalfWord((uint)dst,*(ushort*)src);
		dst=(void*)((uint)dst+2);
		src=(void*)((uint)src+2);
		size-=2;
	}
	for(;size>3;size-=4){
		FLASH_ProgramWord((uint)dst,*(uint*)src);
		dst=(void*)((uint)dst+4);
		src=(void*)((uint)src+4);
	}
	if(size>1){							// not int aligned data
		FLASH_ProgramHalfWord((uint)dst,*(ushort*)src);
		size-=2;
	}
	return ret-size;
}
void flashErasePage(void* dst){
	FLASH_ErasePage((uint)dst);
}*/